package response

import (
	"time"

	"wms/internal/model"
)

// MenuResponse 菜单响应
type MenuResponse struct {
	ID        uint            `json:"id"`
	ParentID  uint            `json:"parent_id"`          // 父菜单ID
	Name      string          `json:"name"`               // 路由名称
	Path      string          `json:"path"`               // 路由路径
	Component string          `json:"component"`          // 组件路径
	Redirect  string          `json:"redirect,omitempty"` // 重定向地址
	Title     string          `json:"title"`              // 菜单标题
	Icon      string          `json:"icon,omitempty"`     // 菜单图标
	Sort      int             `json:"sort"`               // 排序
	Hidden    bool            `json:"hidden"`             // 是否隐藏
	KeepAlive bool            `json:"keep_alive"`         // 是否缓存
	IsFrame   bool            `json:"is_frame"`           // 是否外链
	Status    int             `json:"status"`             // 菜单状态
	Children  []*MenuResponse `json:"children,omitempty"` // 子菜单
	CreatedAt time.Time       `json:"created_at"`
	UpdatedAt time.Time       `json:"updated_at"`
}

// MenuListResponse 菜单列表响应
type MenuListResponse struct {
	Total int64           `json:"total"`
	List  []*MenuResponse `json:"list"`
}

// MenuTreeResponse 菜单树响应
type MenuTreeResponse struct {
	List []*MenuResponse `json:"list"`
}

// BuildMenuTree 构建菜单树
func BuildMenuTree(menus []*model.Menu) []*MenuResponse {
	// 转换为菜单响应
	menuMap := make(map[uint]*MenuResponse)
	var roots []*MenuResponse

	// 先转换所有菜单
	for _, menu := range menus {
		menuResp := &MenuResponse{
			ID:        menu.ID,
			ParentID:  menu.ParentID,
			Name:      menu.Name,
			Path:      menu.Path,
			Component: menu.Component,
			Redirect:  menu.Redirect,
			Title:     menu.Title,
			Icon:      menu.Icon,
			Sort:      menu.Sort,
			Hidden:    menu.Hidden,
			KeepAlive: menu.KeepAlive,
			IsFrame:   menu.IsFrame,
			Status:    menu.Status,
			CreatedAt: menu.CreatedAt,
			UpdatedAt: menu.UpdatedAt,
			Children:  make([]*MenuResponse, 0),
		}
		menuMap[menu.ID] = menuResp
	}

	// 构建树结构
	for _, menu := range menuMap {
		if menu.ParentID == 0 {
			// 根菜单
			roots = append(roots, menu)
		} else {
			// 子菜单
			if parent, ok := menuMap[menu.ParentID]; ok {
				parent.Children = append(parent.Children, menu)
			}
		}
	}

	// 对根菜单和子菜单排序
	for _, menu := range menuMap {
		if len(menu.Children) > 0 {
			sortMenus(menu.Children)
		}
	}
	sortMenus(roots)

	return roots
}

// sortMenus 菜单排序
func sortMenus(menus []*MenuResponse) {
	for i := 0; i < len(menus); i++ {
		for j := i + 1; j < len(menus); j++ {
			if menus[i].Sort > menus[j].Sort {
				menus[i], menus[j] = menus[j], menus[i]
			}
		}
	}
}

// BuildUserMenus 构建用户菜单
func BuildUserMenus(menus []*model.Menu) []*MenuResponse {
	// 只返回状态为正常的菜单
	var validMenus []*model.Menu
	for _, menu := range menus {
		if menu.Status == 1 {
			validMenus = append(validMenus, menu)
		}
	}

	return BuildMenuTree(validMenus)
}
